package com.example.erp;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.mcp.SyncMcpToolCallbackProvider;
import org.springframework.ai.openai.OpenAiChatModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import io.modelcontextprotocol.client.McpSyncClient;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import reactor.core.publisher.Flux;

/**
 * 采用第三方的mcp服务 @modelcontextprotocol/server-filesystem，基于 openai 通过 llm
 * 访问，实现一个本地智能文件管理服务。<br>
 * 详见：https://juejin.cn/post/7474220344699666458
 * <p>
 * chatopenai前置条件：<br/>
 * 1、application.properties 配置 server-filesystem 指定 mcp-servers-config.json ;<br/>
 * 
 * chatopenai2前置条件：<br/>
 * 1、在 clientConfig.java 中注入 server-filesystem 配置信息<br/>
 * @author jiang 2025-03-20
 */

@RestController
public class ChatController {

	@Resource
	private OpenAiChatModel openAiChatModel;
	@Resource
	private SyncMcpToolCallbackProvider toolCallbackProvider;
	
	@Resource
	private ChatClient.Builder chatClientBuilder;
	@Resource
	private McpSyncClient mcpClient;

	// 流式返回
//	http://localhost:8081/mcp/chat?input=有哪些工具可以使用？
	@GetMapping("/chat")
	public Flux<String> openaicall(@RequestParam String input, HttpServletResponse response) {
		response.setCharacterEncoding("UTF-8");

		ChatClient chatClient = ChatClient.builder(openAiChatModel)
				.defaultToolCallbacks(toolCallbackProvider.getToolCallbacks())
				.build();
		
		// 输出的文件名 jiang_mcp_client_properties_filesystem_read_file，
		// 前缀带是 jiang_mcp_client_properties，表明是来自 application.properties 里配置的
		return chatClient.prompt(input).stream().content();
	}
	
	// 流式返回
//	http://localhost:8081/mcp/chat2?input=What tools are available?
	@GetMapping("/chat2")
	public Flux<String> openaicall2(@RequestParam String input, HttpServletResponse response) {
		response.setCharacterEncoding("UTF-8");

		ChatClient chatClient = chatClientBuilder
				.defaultToolCallbacks(new SyncMcpToolCallbackProvider(mcpClient))
				.build();
		
		// 输出的文件名 jiang_mcp_client_java_read_file，
		// 前缀带是 jiang_mcp_client_java，表明是来自 ClientConfig.java 里配置的
		return chatClient.prompt(input).stream().content();
	}
	
}
// 使用方式
//localhost:8080/chatopenai?input=有哪些工具可以使用
//localhost:8080/chatopenai?input=帮我创建一个文件夹 mcp
//localhost:8080/chatopenai?input=帮我在文件夹mcp下创建一个 test.txt 文件，并写入 hello mcp！
//localhost:8080/chatopenai?input=帮我将 mcp/test.txt 中 hello mcp 改为 Hello MCP！